﻿/**
* Класс реализует слайдшоу в конкретном контейнере,
* При этом используется предварительное кеширование классом  CacheManager
* @author Firsoff Maxim, ICQ:235859730, email: firsoff_maxim@mail.ru
* @version 0.1/08.02.2008 11:04
*/

package ru.vega_int.firsoff.as3 
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import fl.transitions.*;
	import fl.transitions.easing.*;
	
	import ru.vega_int.firsoff.as3.CacheManager;
	import ru.vega_int.firsoff.as3.events.CacheManagerEvents;
	import ru.vega_int.firsoff.as3.events.SlideShowEvent;
	import ru.vega_int.firsoff.as3.ImageViewer;
	import ru.vega_int.firsoff.as3.events.ImageViewerEvent;
	
	public class SlideShow extends Sprite
	{
		
		//	PROPERTIES
		
		//	private
		private var content:Array;					//	контент слайдшоу
		private var _height:Number;					//	высота содежимого контейнера
		private var _width:Number;					//	ширина содежимого контейнера
		private var time_switch:Number;				//	время переключения
		private var time_show:Number;				//	время показа
		private var active:Sprite;					//	изображение которое показывается сейчас
		private var passive:Sprite;					//	изображение которое скрывается
		private var faderActive:TransitionManager;	//	фейдер для активного изображения
		private var faderPassive:TransitionManager;	//	фейдер для пассивного изображения
		private var randomPlay:Boolean;				//	случайное проигрывание
		private var cache:CacheManager;				//	кеш менеджер
		private var timer:Timer;					//	таймер
		private var pointer:uint;					//	указатель
		private var totalPreloadFiles:int;			//	колво файлов для предазгрузки
		private var isPreloadComplete:Boolean;		//	презагрузка окончена?
		private var isRun:Boolean;					//	уже был запуск?
		private var counterCacheLoad:uint;			//	колво загруженных в кеш
		//	public
		
		
		public function SlideShow(content:Array, w:Number, h:Number, randomPlay:Boolean=false, timeSwitch:Number=0.6, timeShow:Number=2, totalPreloadFiles:int=2) 
		{
			// каждый член content  - объект {url:String, data:String, id:uint}
			// data - Как правило надпись к фотке
			// id - уникальный идентификатор, как правило порядковый номер в массиве
			this.content = content;
			this._width = w;
			this._height = h;
			this.randomPlay = randomPlay;
			this.time_show = Math.abs(timeShow + timeSwitch*2) * 1000;		//	в миллисекундах
			this.time_switch = Math.abs(timeSwitch);
			this.totalPreloadFiles = totalPreloadFiles;
			//	защита от дурака
			if(totalPreloadFiles > content.length - 1){this.totalPreloadFiles = content.length - 1;}
			init();
		};
		
		//	MEHODS
		
		//	private
		private function init():void
		{
			pointer = 0;
			isPreloadComplete = false;
			//	если случайный список, то произведем случайную сортировку
			if(randomPlay)
			{
				content = randomArray(content);
			};
			createContainers();	//	создаем контейнеры
			createCache();		//	создаем кеш, после того как в кеше будет 2 фотки, можно сделать показ
			timer = new Timer(time_show, 999);
			timer.addEventListener(TimerEvent.TIMER, timerHandler);
		};
		
		/**
		 * Генерация массива со случайным положением членов
		 * @param	a	Входной массив
		 * @return	Новый массив
		 */
		private function randomArray(a:Array):Array
		{
			var output:Array = new Array();		//	выходной массив
			var input:Array = a;				//	входной
			var indexArray:Array = new Array();	//	массив индексов
			var total:uint = input.length;		//	общее колво элементов входного массива
			if(total > 1)
			{
				//	создаем массив индексов
				for(var i:uint=0; i < input.length; i++){indexArray.push(i);};
				//	сортируем случайным образом индексы и заносим в выходной массив данные
				while (total) 
				{
					var r:uint = Math.floor(Math.random() * (total));
					output.push(input[indexArray[r]]);
					indexArray.splice(r, 1);
					total--;
				};
				/*for(var j:Number = 0; j< output.length; j++)	//	проверка
				{
					trace(output[j].url)
				};*/
			}
			else{output = input;};
			return output;
		};
		
		/**
		 * Начинает процесс загрузки
		 */
		private function load():void
		{
			
		};
		
		private function createContainers():void
		{
			active = new MovieClip();
			passive = new MovieClip();
			addChild(passive);
			addChild(active);
		};
		
		private function createCache():void
		{
			cache = new CacheManager();
			//	приготовим урлы для кеша
			var urls:Array = new Array();
			for(var j:Number = 0; j< content.length; j++){urls.push(content[j].url);};
			cache.addEventListener(CacheManagerEvents.LOAD, cacheLoadingHandler);
			cache.addToQueue(urls);
		};
		
		private function initFader():void
		{
			//faderActive = new TransitionManager(active);
			//faderPassive = new TransitionManager(passive);
		};
		
		//	<---------------- HANDLERS
		/**
		 * Обработчик события загрузки в кеш 1 файла
		 * @param	e
		 */
		private function cacheLoadingHandler(e:Event):void
		{
			//trace('loaded: ' + CacheManager(e.target).currentURL);
			counterCacheLoad++;
			if(counterCacheLoad == totalPreloadFiles && !isPreloadComplete)
			{
				isPreloadComplete = true;
				this.dispatchEvent(new SlideShowEvent(SlideShowEvent.PRELOAD_COMPLETE));
			};
		};
		
		private function timerHandler(e:TimerEvent):void
		{
			next();
		};
		//	------------------------->
		
		/**
		 * ПОказ изображения
		 * @param	index	Индекс изображения (порядковый номер)
		 */
		private function show(index:uint):void
		{
			//trace('show : ' + index);
			// скрываем активный
			//faderActive.startTransition({type:Fade, direction:Transition.OUT, duration:time_switch, easing:None.easeOut});
			var c:Sprite = createContainer();
			addChild(c);
			var iv:ImageViewer = new ImageViewer(c, content[index].url, _width, _height, "C", false, null, true, time_switch, false, true);
			//trace(this.numChildren)
		};
		
		private function createContainer():Sprite
		{
			var c:Sprite = new Sprite();
			c.graphics.beginFill(0xFFFFFF, 0);
			c.graphics.drawRect(0,0,_width, _height);
			return c;
		};

		//	public
		
		/**
		 * Старт слайдшоу, всегда запускает с 0 изображения
		 */
		public function start():void
		{
			pointer = 0;
			show(pointer);					//	запуск с нулевого элемента
			timer.reset();				//	сброс таймера ??????
			timer.start();				//	запуск таймера
		};
		
		
		/**
		 * Останов слайдшоу
		 */
		public function stop():void
		{
			
		};
		
		/**
		 * Переход к следующей фотке
		 */
		public function next():void
		{
			pointer++;
			if(pointer > content.length - 1){pointer = 0;};
			show(pointer);
		};
		
		/**
		 * Переход к предыдущей фотке
		 */
		public function prev():void
		{
			
		};
		
		/**
		 * Уничтожает все текущие загрузки, очищает все объекты созданные при работе экземпляра
		 */
		public function destroy():void
		{
			//trace('!!!!!');
		};
	};
};
